home *** CD-ROM | disk | FTP | other *** search
/ Aminet 33 / Aminet 33 - October 1999.iso / Aminet / comm / misc / DigiCam.lha / src / frontend.c < prev    next >
Encoding:
C/C++ Source or Header  |  1999-07-15  |  8.3 KB  |  376 lines

  1. /* frontend.c (c) 1999 by Volker Remuß, remuss@cs.tu-berlin.de */
  2.  
  3. /* Camera includes */
  4.  
  5. #include "camera.h"
  6. #include "debughelp.h"
  7. #include "cameraops.h"
  8.  
  9. /* ANSI-C-Includes */
  10.  
  11. #include <stdio.h>
  12. #include <stdlib.h>
  13. #include <string.h>
  14. #include <time.h>
  15.  
  16.  
  17. /* Amiga inlcudes */
  18.  
  19. #include <dos.h>                // needed for onbreak on Amiga
  20. #include <proto/dos.h>
  21. #include <dos/rdargs.h>
  22.  
  23. #define QUIET 1
  24.  
  25. LONG __oslibversion = 37;
  26.  
  27. char *VersionString = "$VER: digicam 1.0  " __AMIGADATE__ "  (c) Volker Remuss";
  28.  
  29.  
  30. char *Template=
  31. "DEVICE/A,UNIT/A/N,BPS/A/N,SAVENAME,INFO/S,DIR/S,GF=GETFRAME/K,GT=GETTHUMBNAIL/K,GU=GETAUDIO/K,GA=GETANIM/K,\
  32. GAT=GETANIMTHUMB/K,MP=MAKEPREVIEW/S,TP=TAKEPICTURE/S,ERASEALL/S,ERASELAST/S,ERF=ERASEFRAME/K,ERA=ERASEANIM/K,RES=RESOLUTION/N,\
  33. SH=SHUTTERSPEED/N,FM=FLASHMODE/N,AP=APERTURE/N,CM=COLORMODE/N,LS=LCDSHUT/N,ASH=AUTOSHUTHOST/N,ASF=AUTOSHUTFIELD/N,\
  34. LM=LENSMODE/N,BM=BITMAP/N,EXP=EXPMETER/N,BC=BRIGHTNESSCONTR/N,WB=WHITEBALANCE/N,LD=LCDDATEFORMAT/N,LB=LCDBRIGTHNESS/N,\
  35. ST=SETTIME/S,RI=READINTREG/K,RD=READDATAREG/K,SI=SETINTREG/N,V=VALUE/N,TA=TAKEACTION/N,DELAY/N";
  36.  
  37. struct DigicamArgs
  38. {
  39.     char *device;
  40.     LONG *unit, *bps;
  41.     char *filename;
  42.     LONG info, dir;
  43.     char *getframe, *getthumb, *getaudio, *getanim, *getanimthumb;
  44.     LONG makepreview, takepicture, eraseall, eraselast;
  45.     char *eraseframe, *eraseanim;
  46.     LONG *resolution, *shutter, *flash, *aperture, *colorm, *lcdshut, *ashost, *asfield, *lensm, *bitmapm;
  47.     LONG *expmeter, *brightc, *whitebal, *lcddatef, *lcdbright, settime;
  48.     char *readint, *readdata;
  49.     LONG *setint, *value, *action, *delay;
  50. };
  51.  
  52.  
  53. struct RDArgs *RDArgs=0;
  54. struct DigicamArgs Args;
  55.  
  56. int oldtime;
  57.  
  58.  
  59. int myexit(int res)
  60. {
  61.     closeserial();
  62.     FreeArgs(RDArgs);
  63.     FreeDosObject(DOS_RDARGS, RDArgs);
  64.     exit(res);
  65.     return(0);                    //dummy
  66. }
  67.  
  68. int breakdummy(void)            // needed to avoid warnings concerning onbreak
  69. {
  70.     printf("\n***Break ... requested by user\n");
  71.     closecamera();
  72.     closeserial();
  73.     myexit(10);
  74.     return(0);                    //dummy
  75. }
  76.  
  77. void main(char **argv, int argc)
  78. {
  79.     char stringbuf[1024];
  80.     char *tmpstr;
  81.     unsigned char ib;
  82.     int16 lastpack;
  83.     int16 size;
  84.  
  85.     memset(&Args, 0, sizeof(Args));
  86.  
  87.     if (!(RDArgs=AllocDosObject(DOS_RDARGS, NULL)))
  88.     {
  89.         PrintFault(ERROR_NO_FREE_STORE, "DigiCam");
  90.         exit(10);
  91.     }
  92.  
  93.     if (!(ReadArgs(Template,(LONG *)&Args,RDArgs)))
  94.     {
  95.         PrintFault(IoErr(), "DigiCam");
  96.         FreeDosObject(DOS_RDARGS, RDArgs);
  97.         exit(10);
  98.     }
  99.  
  100.    onbreak(&breakdummy);                            // ctrl-c handling in SAS/C
  101.  
  102.     initserial(Args.device, *(Args.unit));                // never returns when error occured
  103.     if (-1 == initcamera(19200, *(Args.bps), !QUIET)) myexit(10);
  104.  
  105.     if ((Args.filename))
  106.     {
  107.         printf("Basefilename is: %s\n", Args.filename);
  108.     }
  109.  
  110.     chkabort();
  111.  
  112.     /* put - all known registers */
  113.     if (Args.resolution) putint32reg(RESOLUTION,             *(Args.resolution));
  114.     if (Args.shutter)     putint32reg(SHUTTER_SPEED,         *(Args.shutter));
  115.     if (Args.flash)         putint32reg(FLASH_MODE,                 *(Args.flash));
  116.     if (Args.aperture)     putint32reg(APERTURE,                 *(Args.aperture));
  117.     if (Args.colorm)         putint32reg(COLOR_MODE,             *(Args.colorm));
  118.     if (Args.lcdshut)     putint32reg(LCD_AUTOSHUT,             *(Args.lcdshut));
  119.     if (Args.ashost)         putint32reg(AUTOSHUT_ON_HOST,     *(Args.ashost));
  120.     if (Args.asfield)     putint32reg(AUTOSHUT_IN_FIELD,     *(Args.asfield));
  121.     if (Args.lensm)         putint32reg(LENS_MODE,                 *(Args.lensm));
  122.     if (Args.bitmapm)     putint32reg(BITMAP,                     *(Args.bitmapm));
  123.     if (Args.expmeter)     putint32reg(EXP_METER,                 *(Args.expmeter));
  124.     if (Args.brightc)     putint32reg(BRIGHTNESS_CONTRAST, *(Args.brightc));
  125.     if (Args.whitebal)     putint32reg(WHITE_BALANCE,         *(Args.whitebal));
  126.     if (Args.lcddatef)     putint32reg(LCD_DATE,                 *(Args.lcddatef));
  127.     if (Args.lcdbright)     putint32reg(LCD_BRIGHTNESS,         *(Args.lcdbright));
  128.     if (Args.settime)
  129.     {
  130.         oldtime = time(0);
  131.         putint32reg(CLOCK, (int)mktime(gmtime((time_t *)&oldtime))-12*60*60);
  132.     }
  133.  
  134.     /* Process Actions */
  135.  
  136.     if (Args.setint)
  137.     {
  138.         if (!(Args.value))
  139.         {
  140.             printf("To set a register a value is needed.\n");
  141.             myexit(10);
  142.         }
  143.         if    (-1 == putint32reg((unsigned char)(*Args.setint), *(Args.value)))
  144.             printf("Set failed\n");
  145.     }
  146.  
  147.     if (Args.readint)
  148.     {
  149.         if (tmpstr=strstr(Args.readint, "-"))                        // range ?
  150.         {
  151.             tmpstr[0] = 0;
  152.             for (ib=atoi(Args.readint); ib <= atoi(tmpstr+1); ib++) 
  153.             {
  154.                 printf("int32-register %d : ", ib);
  155.                 fflush(stdout);
  156.                 printf("%d\n", getint32reg(ib));
  157.                 closecamera();
  158.                 delay(10);
  159.                 if (-1 == initcamera(19200, *(Args.bps), QUIET)) myexit(10);
  160.                 
  161.             }
  162.         }
  163.         else                                                        // single register 
  164.         {
  165.             printf("int32-register %s : ", Args.readint);
  166.             fflush(stdout);
  167.             printf("%d\n", getint32reg((unsigned char)atoi(Args.readint)));
  168.         }
  169.     }
  170.  
  171.     if (Args.readdata)
  172.     {
  173.         if (tmpstr=strstr(Args.readdata, "-"))                        // range ?
  174.         {
  175.             tmpstr[0] = 0;
  176.             for (ib=atoi(Args.readdata); ib <= atoi(tmpstr+1); ib++)
  177.             {
  178.                 printf("vdata-register %d : ", ib);
  179.                 fflush(stdout);
  180.                 initgetvdatareg(ib);
  181.                 lastpack = 0;
  182.                 while (!(lastpack))
  183.                 {
  184.                     if ((-1 == getdatapacket(buf, &size, &lastpack, 0))
  185.                         || (size == 0))
  186.                     {
  187.                         printf("vdata?-register %d failed\n", ib);
  188.                         lastpack = 1;
  189.                     }
  190.                     else
  191.                     {
  192.                         printf("\n");
  193.                         hexdump(buf, size);
  194.                     }
  195.                 }
  196.             }
  197.         }
  198.         else
  199.         {
  200.             printf("\nContents of register : \n");
  201.             initgetvdatareg((unsigned char)atoi(Args.readdata));
  202.             lastpack = 0;
  203.             while (!(lastpack))
  204.             {
  205.                 if ((-1 == getdatapacket(buf, &size, &lastpack, 0))
  206.                     || (size == 0))
  207.                 {
  208.                     printf("Reading register vdata %d failed\n", (unsigned char)atoi(Args.readdata));
  209.                     lastpack = 1;
  210.                 }
  211.                 else
  212.                 {
  213.                     hexdump(buf, size);
  214.                 }
  215.             }
  216.         }
  217.     }
  218.  
  219.     if (Args.action)
  220.     {
  221.         if (!(Args.value))
  222.         {
  223.             printf("Since there is no argument (value) for takeaction it defaults to 0\n");
  224.             takeaction(*(Args.action), 0);
  225.         }
  226.         else
  227.             takeaction(*(Args.action), *(Args.value));
  228.     }
  229.  
  230.  
  231.     /* Printout information about camera */
  232.     if (Args.info) camerainfo();
  233.  
  234.     /* Erase frames */
  235.     if (Args.eraseall)
  236.     {
  237.         if (-1 == takeaction(ERASE_ALL, 0))
  238.         {
  239.             printf("Erase all failed\n");
  240.             myexit(10);
  241.         }
  242.     }        
  243.  
  244.     if (Args.eraselast)
  245.     {
  246.         if (-1 == takeaction(ERASE_LAST, 0))
  247.         {
  248.             printf("Erase last failed\n");
  249.             myexit(10);
  250.         }
  251.     }        
  252.  
  253.     if (Args.eraseframe)
  254.     {
  255.         if (-1 == eraserange(Args.eraseframe, PICT))
  256.         {
  257.             printf("Erase frame(s) failed\n");
  258.             myexit(10);
  259.         }
  260.     }
  261.  
  262.     if (Args.eraseanim)
  263.     {
  264.         if (-1 == eraserange(Args.eraseanim, ANIM))
  265.         {
  266.             printf("Erase anim(s) failed\n");
  267.             myexit(10);
  268.         }
  269.     }
  270.  
  271.     /* Get Preview (Live-Picture) and save to file */
  272.     if (Args.makepreview)
  273.     {
  274.         if (!(Args.filename))
  275.         {
  276.             printf("Filename needed!\n");
  277.             closecamera();
  278.             myexit(10);
  279.         }
  280.         printf("Taking preview\n");
  281.         sprintf(stringbuf, "%s_p.jpg", Args.filename);
  282.         if (-1 == takeaction(TAKE_PREVIEW, 0)) myexit(10);
  283.         if (-1 == saveframe(0, stringbuf, PICT))
  284.         {
  285.             printf("Error retreiving frame\n");    
  286.             myexit(10);
  287.         }    
  288.     }
  289.  
  290.  
  291.     /* Take Picture including LED-Action accompanied shutter release delay */
  292.     if (Args.takepicture)
  293.     {
  294.         if (Args.delay)                                // delayed shutter release
  295.         {
  296.             if (*(Args.delay) > 2)
  297.             {
  298.                 for (oldtime=(int)time(0); (int)time(0) < oldtime+*(Args.delay)-2;)
  299.                 {
  300.                     putint32reg(LED, 1);                    // LED on resend at every loop to keep the camera alive
  301.                     delay(20);
  302.                     chkabort();
  303.                 }
  304.             }
  305.             putint32reg(LED, 2);                        // LED blink
  306.             delay(100);
  307.         }
  308.         if (-1 == takeaction(TAKE_PICTURE, 0))
  309.         {
  310.             putint32reg(LED, 0);
  311.             myexit(10);
  312.         }
  313.         putint32reg(LED, 0);
  314.     }
  315.         
  316.  
  317.     /* Save frames, All, Range (xx-yy) or single */
  318.     if (Args.getframe)
  319.     {
  320.         if (-1 == saveframerange(Args.getframe, PICT, Args.filename, stringbuf))
  321.         {
  322.             printf("Saving picture(s) failed\n");
  323.             closecamera();
  324.             myexit(10);
  325.         }
  326.     }        
  327.  
  328.     if (Args.getthumb)
  329.     {
  330.         if (-1 == saveframerange(Args.getthumb, THUMB, Args.filename, stringbuf))
  331.         {
  332.             printf("Saving thumbnail(s) failed\n");
  333.             closecamera();
  334.             myexit(10);
  335.         }
  336.     }        
  337.  
  338.     if (Args.getanim)
  339.     {
  340.         if (-1 == saveanimrange(Args.getanim, ANIM, Args.filename, stringbuf))
  341.         {
  342.             printf("Saving anim(s) failed\n");
  343.             closecamera();
  344.             myexit(10);
  345.         }
  346.     }        
  347.  
  348.     if (Args.getanimthumb)
  349.     {
  350.         if (-1 == saveanimrange(Args.getanimthumb, THUMB, Args.filename, stringbuf))
  351.         {
  352.             printf("Saving animthumb(s) failed\n");
  353.             closecamera();
  354.             myexit(10);
  355.         }
  356.     }        
  357.  
  358.     if (Args.getaudio)
  359.     {
  360.         if (-1 == savewavs(Args.getaudio, Args.filename, stringbuf))
  361.         {
  362.             printf("Saving wave(s) failed\n");
  363.             closecamera();
  364.             myexit(10);
  365.         }
  366.     }        
  367.  
  368.  
  369.     if (Args.dir) dircamera();
  370.  
  371.     closecamera();
  372.     delay(50);
  373.     myexit(0);
  374.  
  375. }
  376.